package com.hksj.tdengine.taos.mapper;


import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.hksj.tdengine.taos.annatation.DS_TAOS;
import com.hksj.tdengine.taos.model.BaseTaosModel;
import org.apache.ibatis.annotations.*;

import java.util.List;


 /**
  * Taos基础mapper，包含基础语句
  * @author zengke
  * @version 1.0
  * @see BaseTaosMapper
  * @since 2024/7/5 10:40
  */

public interface BaseTaosMapper<T extends BaseTaosModel<T>> extends BaseMapper<T> {

    /**
     * 创建默认数据库
     *
     * @param baseTaosModel taos实体
     */
    @Update("create database if not exists ${baseTaosModel.databaseName}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void createDatabase(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 创建具有过期时间的数据库
     *
     * @param baseTaosModel taos基础实体
     * @param duration      过期间隔时间
     * @param keep          保留数据时间
     */
    @Update("create database if not exists ${baseTaosModel.databaseName} duration ${duration} keep ${keep}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void createDatabaseDuration(@Param("baseTaosModel") T baseTaosModel,
                                @Param("duration") String duration,
                                @Param("keep") String keep);

    /**
     * 创建超级表
     *
     * @param baseTaosModel taos实体
     */
    @Update("create stable if not exists ${baseTaosModel.databaseName}.${baseTaosModel.stableName} ${baseTaosModel.createValues}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void createSTable(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 删除超级表
     *
     * @param baseTaosModel taos基础类
     */
    @Update("drop stable if exists ${baseTaosModel.databaseName}.${baseTaosModel.stableName}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void dropSuperTable(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 删除表
     *
     * @param baseTaosModel taos基础类
     */
    @Update("drop table if exists ${baseTaosModel.databaseName}.${baseTaosModel.tableName}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void dropTable(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 新增数据
     *
     * @param baseTaosModel taos基础类
     * @return 影响行数
     */
    @Insert("insert into ${baseTaosModel.databaseName}.${baseTaosModel.tableName} using ${baseTaosModel.databaseName}.${baseTaosModel.stableName} ${baseTaosModel.insertTag} ${baseTaosModel.insertValue}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    int insert(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 批量新增
     * @param baseTaosModel taos基础类
     * @param insertSql 新增语句
     * @return 影响行数
     */
    @Insert("insert into ${baseTaosModel.databaseName}.${baseTaosModel.tableName} using ${baseTaosModel.databaseName}.${baseTaosModel.stableName} ${insertSql}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    int insertBatch(@Param("baseTaosModel") T baseTaosModel, @Param("insertSql") String insertSql);

    /**
     * 获取taos所有数据库名方法
     *
     * @return 数据库名list
     */
    @Select("show databases")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    List<String> showDatabases();

    /**
     * 获取实体类对应数据库下所有超级表名方法
     *
     * @param baseTaosModel taos实体
     * @return 数据库下所有超级表list
     */
    @Select("show ${baseTaosModel.databaseName}.stables")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    List<String> showSTables(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 获取实体类对应数据库下所有表名方法
     *
     * @param baseTaosModel taos实体
     * @return 数据库下所有表list
     */
    @Select("show ${baseTaosModel.databaseName}.tables")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    List<String> showTables(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 切换数据库
     *
     * @param baseTaosModel taos实体
     */
    @Update("use ${baseTaosModel.databaseName}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void useDatabase(@Param("baseTaosModel") T baseTaosModel);

    /**
     * 创建数据流
     *
     * @param streamName    流名称
     * @param streamOptions 流参数
     * @param stbName       超级表名称
     * @param subquery      查询语句
     */
    @Update("create stream if not exists ${streamName} ${streamOptions} INTO ${stbName} AS ${subquery}")
    @InterceptorIgnore(tenantLine = "true") //忽略租户插件
    void createStream(@Param("streamName") String streamName, @Param("streamOptions") String streamOptions,
                      @Param("stbName") String stbName, @Param("subquery") String subquery);
}
